package com.iamteer.day13;
/**
主要回顾：进程

进程：正在执行的程序称为一个进程


线程：进程中的一个执行，负责执行代码

多线程：在一个进程中有多个线程同时执行

一个 Java 程序至少有 2 个线程：
	一个主线程，执行 Main 方法，一个垃圾回收器线程，负责回收垃圾。

多线程的好处：
	1. 解决一个进程执行多任务的问题
	2. 提高资源的利用率
	
多线程的弊端：
	1. 增加 CPU 的负担
	2. 降低了一个进程中线程的执行效率
	3. 引发了线程安全问题
	4. 出现了死锁现象

创建多线程的方式：
	方式1：
		1. 将类声明为 Thread 的子类
		2. 重写 run 方法
		3. 创建 Thread 的子类对象，并且调用 start 方法开启线程
	
	方式2：
		1. 声明实现 Runnable 接口的类
		2. 实现 run 方法
		3. 创建 Runnable 实例
		4. 以该实例为参数创建 Thread 并启动
		
		注意：Runnable 实现类的对象不是线程对象，只是实现了 Runnable 接口的普通对象而已
			只有 Thread 或者是 Thread 的子类才是线程对象
		
线程的生命周期：

					临时阻塞状态
					|		  |
创建-------->可运行状态<-------->运行状态-------->死亡状态
new			 等待 CPU		  使用 CPU			销毁

临时阻塞状态：
运行状态下的线程一时执行 sleep 或者 wait 方法后，进入临时阻塞状态。
如果调用 sleep 方法，则超过指定的睡眠时间后，线程重新进入可运行状态；
如果调用 wait 方法，则需要其他线程唤醒，该线程才重新进入可运行状态。
 */
class Thread1 extends Thread{
	@Override
	public void run() {	//定义该线程的自定义的任务
		for (int i = 0; i < 100; i++) {			
			System.out.println("Thread..." + i);
		}
	}	
}

class Thread2 implements Runnable{
	@Override
	public void run() {	//定义该线程的自定义的任务
		for (int i = 0; i < 100; i++) {			
			System.out.println("Runnable..." + i);
		}
	}
}

public class LearnThread{


	public static void main(String[] args) {
		//创建线程方法一：
		Thread1 t = new Thread1();		//创建 Thread 的子类对象
		t.start();						//调用 start 方法开启线程
		
		//创建线程方法二：
		Thread2 p = new Thread2();		//创建 Runnable 实例
		new Thread(p).start();			//以该实例为参数创建 Thread 并启动
		
		//主线程
		for (int i = 0; i < 100; i++) {			
			System.out.println("Main..." + i);
		}
	}

}
